home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-06-13 | 9.7 KB | 382 lines | [TEXT/KAHL] |
- ///--------------------------------------------------------------------------------------
- // RockSprite.c
- //
- // Created: 6/18/92 at 4:41:49 PM
- // By: Tony Myles
- //
- // Copyright: © 1992-93 Tony Myles, All rights reserved worldwide.
- //
- ///--------------------------------------------------------------------------------------
-
-
- #ifndef __GAMEUTILS__
- #include <GameUtils.h>
- #endif
-
- #ifndef __DEBUGUTILS__
- #include <DebugUtils.h>
- #endif
-
- #ifndef __SPRITE__
- #include <Sprite.h>
- #endif
-
- #ifndef __BLITPIXIE__
- #include <BlitPixie.h>
- #endif
-
- #ifndef __SHIPSPRITE__
- #include "ShipSprite.h"
- #endif
-
- #ifndef __ROCKSPRITE__
- #include "RockSprite.h"
- #endif
-
-
- extern RgnHandle gWorkRgn;
-
-
- ///--------------------------------------------------------------------------------------
- // CreateRockSpriteInfo
- ///--------------------------------------------------------------------------------------
-
- OSErr CreateRockSpriteInfo(
- RockSpriteInfoPtr* rockSpriteInfoP,
- SpriteWorldPtr spriteWorldP,
- SpriteLayerPtr spriteLayerP)
- {
- OSErr err;
- RockSpriteInfoPtr tempRockSpriteInfoP;
- short rockSpriteNum, numRockSprites, rockFrameNum;
-
- *rockSpriteInfoP = NULL;
-
- tempRockSpriteInfoP = (RockSpriteInfoPtr)NewPtrClear(sizeof(RockSpriteInfoRec));
-
- if (tempRockSpriteInfoP != NULL)
- {
- tempRockSpriteInfoP->rockSpriteLayerP = spriteLayerP;
- tempRockSpriteInfoP->rockSpriteWorldP = spriteWorldP;
- tempRockSpriteInfoP->rockWrapRect = spriteWorldP->backFrameP->frameRect;
- tempRockSpriteInfoP->mediumRockInd = 0;
- tempRockSpriteInfoP->smallRockInd = 0;
-
- err = CreateRockSpriteArray(
- tempRockSpriteInfoP,
- tempRockSpriteInfoP->largeRockSpriteArray,
- kLargeRockFrameResID,
- kNumberOfLargeRockFrames,
- kNumberOfLargeRockSprites);
-
- if (err == noErr)
- {
- err = CreateRockSpriteArray(
- tempRockSpriteInfoP,
- tempRockSpriteInfoP->mediumRockSpriteArray,
- kMediumRockFrameResID,
- kNumberOfMediumRockFrames,
- kNumberOfMediumRockSprites);
- }
-
- if (err == noErr)
- {
- err = CreateRockSpriteArray(
- tempRockSpriteInfoP,
- tempRockSpriteInfoP->smallRockSpriteArray,
- kSmallRockFrameResID,
- kNumberOfSmallRockFrames,
- kNumberOfSmallRockSprites);
- }
-
- if (err == noErr)
- {
- *rockSpriteInfoP = tempRockSpriteInfoP;
- }
- }
- else
- {
- err = MemError();
- }
-
- return err;
- }
-
-
- OSErr CreateRockSpriteArray(
- RockSpriteInfoPtr rockSpriteInfoP,
- SpritePtr *rockSpriteArray,
- short rockResID,
- short numberOfRockFrames,
- short numberOfRockSprites)
- {
- OSErr err;
- short rockSpriteNum = 0;
- SpritePtr rockSpriteP, newRockSpriteP;
-
- err = SWCreateSpriteFromCIconResource(&rockSpriteP, NULL, rockResID,
- numberOfRockFrames, kFatMask);
-
- if (err == noErr)
- {
- rockSpriteP->userData = (long)rockSpriteInfoP;
- rockSpriteArray[0] = rockSpriteP;
-
- for (rockSpriteNum = 1; rockSpriteNum < numberOfRockSprites; rockSpriteNum++)
- {
- err = SWCloneSprite(rockSpriteP, &newRockSpriteP, NULL);
-
- if (err == noErr)
- {
- newRockSpriteP->userData = (long)rockSpriteInfoP;
- rockSpriteArray[rockSpriteNum] = newRockSpriteP;
- }
- else
- {
- break;
- }
- }
- }
-
- if (err != noErr)
- {
- // dispose of any sprites that we managed to create
- numberOfRockSprites = rockSpriteNum;
-
- for (rockSpriteNum = 0; rockSpriteNum < numberOfRockSprites; rockSpriteNum++)
- {
- SWDisposeSprite(rockSpriteArray[rockSpriteNum], rockSpriteNum == 0);
- }
- }
-
- return err;
- }
-
-
- void DisposeRockSpriteInfo(
- RockSpriteInfoPtr rockSpriteInfoP)
- {
- short rockSpriteNum;
-
- if (rockSpriteInfoP != NULL)
- {
- for (rockSpriteNum = 0; rockSpriteNum < kNumberOfLargeRockSprites; rockSpriteNum++)
- {
- SWDisposeSprite(rockSpriteInfoP->largeRockSpriteArray[rockSpriteNum], rockSpriteNum == 0);
- }
-
- for (rockSpriteNum = 0; rockSpriteNum < kNumberOfMediumRockSprites; rockSpriteNum++)
- {
- SWDisposeSprite(rockSpriteInfoP->mediumRockSpriteArray[rockSpriteNum], rockSpriteNum == 0);
- }
-
- for (rockSpriteNum = 0; rockSpriteNum < kNumberOfSmallRockSprites; rockSpriteNum++)
- {
- SWDisposeSprite(rockSpriteInfoP->smallRockSpriteArray[rockSpriteNum], rockSpriteNum == 0);
- }
-
- DisposePtr((Ptr)rockSpriteInfoP);
- }
- }
-
-
- void SetupRockSpriteInfo(
- RockSpriteInfoPtr rockSpriteInfoP)
- {
- register SpritePtr rockSpriteP;
- short rockNum, horizVel, vertVel, horizLoc, vertLoc;
-
- for (rockNum = 0; rockNum < kNumberOfLargeRockSprites; rockNum++)
- {
- rockSpriteP = rockSpriteInfoP->largeRockSpriteArray[rockNum];
-
- SWLockSprite(rockSpriteP);
-
- horizLoc = (rockNum & 1) != 0 ?
- GetRandom(0, 100) :
- GetRandom(rockSpriteInfoP->rockWrapRect.right - 100,
- rockSpriteInfoP->rockWrapRect.right);
- vertLoc = GetRandom(20, rockSpriteInfoP->rockWrapRect.bottom - 20);
-
- horizVel = GetRandom(1, 5);
- vertVel = GetRandom(1, 5);
-
- if (GetRandom(0, 1) == 0)
- {
- horizVel = -horizVel;
- }
-
- if (GetRandom(0, 1) == 0)
- {
- vertVel = -vertVel;
- }
-
- SWSetSpriteMoveBounds(rockSpriteP, &rockSpriteInfoP->rockWrapRect);
- SWSetSpriteMoveProc(rockSpriteP, SWWrapSpriteMoveProc);
- SWSetSpriteMoveTime(rockSpriteP, kRockTickDelay);
- SWSetSpriteMoveDelta(rockSpriteP, horizVel, vertVel);
- SWSetSpriteLocation(rockSpriteP, horizLoc, vertLoc);
-
- SWSetSpriteFrameTime(rockSpriteP, (rockNum + 1) * 50);
- SWSetSpriteFrameAdvance(rockSpriteP, 1);
- SWSetSpriteFrameRange(rockSpriteP, kFirstRockFrame, kLastLargeRockFrame);
-
- SWSetSpriteDrawProc(rockSpriteP, BlitPixieMaskDrawProc);
- SWSetSpriteCollideProc(rockSpriteP, LargeRockCollideProc);
- }
-
- for (rockNum = 0; rockNum < kNumberOfMediumRockSprites; rockNum++)
- {
- rockSpriteP = rockSpriteInfoP->mediumRockSpriteArray[rockNum];
-
- SWLockSprite(rockSpriteP);
-
- horizVel = GetRandom(1, 5);
- vertVel = GetRandom(1, 5);
-
- if (GetRandom(0, 1) == 0)
- {
- horizVel = -horizVel;
- }
-
- if (GetRandom(0, 1) == 0)
- {
- vertVel = -vertVel;
- }
-
- SWSetSpriteMoveBounds(rockSpriteP, &rockSpriteInfoP->rockWrapRect);
- SWSetSpriteMoveProc(rockSpriteP, SWWrapSpriteMoveProc);
- SWSetSpriteMoveTime(rockSpriteP, kRockTickDelay / 2);
- SWSetSpriteMoveDelta(rockSpriteP, horizVel, vertVel);
-
- SWSetSpriteFrameTime(rockSpriteP, (rockNum + 1) * 50);
- SWSetSpriteFrameAdvance(rockSpriteP, 1);
- SWSetSpriteFrameRange(rockSpriteP, kFirstRockFrame, kLastMediumRockFrame);
-
- SWSetSpriteDrawProc(rockSpriteP, BlitPixieMaskDrawProc);
- SWSetSpriteCollideProc(rockSpriteP, MediumRockCollideProc);
- }
-
- for (rockNum = 0; rockNum < kNumberOfSmallRockSprites; rockNum++)
- {
- rockSpriteP = rockSpriteInfoP->smallRockSpriteArray[rockNum];
-
- SWLockSprite(rockSpriteP);
-
- horizVel = GetRandom(1, 5);
- vertVel = GetRandom(1, 5);
-
- if (GetRandom(0, 1) == 0)
- {
- horizVel = -horizVel;
- }
-
- if (GetRandom(0, 1) == 0)
- {
- vertVel = -vertVel;
- }
-
- SWSetSpriteMoveBounds(rockSpriteP, &rockSpriteInfoP->rockWrapRect);
- SWSetSpriteMoveProc(rockSpriteP, SWWrapSpriteMoveProc);
- SWSetSpriteMoveTime(rockSpriteP, kRockTickDelay / 3);
- SWSetSpriteMoveDelta(rockSpriteP, horizVel, vertVel);
-
- SWSetSpriteFrameTime(rockSpriteP, (rockNum + 1) * 50);
- SWSetSpriteFrameAdvance(rockSpriteP, 1);
- SWSetSpriteFrameRange(rockSpriteP, kFirstRockFrame, kLastSmallRockFrame);
-
- SWSetSpriteDrawProc(rockSpriteP, BlitPixieMaskDrawProc);
- SWSetSpriteCollideProc(rockSpriteP, SmallRockCollideProc);
- }
- }
-
-
- void LargeRockCollideProc(
- register SpritePtr rockSpriteP,
- SpritePtr shotSpriteP,
- Rect* sectRect)
- {
- if (rockSpriteP->isVisible && shotSpriteP->isVisible)
- {
- RockSpriteInfoPtr rockSpriteInfoP = (RockSpriteInfoPtr)rockSpriteP->userData;
- SpritePtr oneRockSprite, twoRockSprite;
-
- SWSetSpriteVisible(rockSpriteP, false);
- SWSetSpriteMoveProc(rockSpriteP, RemoveRockMoveProc);
-
- oneRockSprite = rockSpriteInfoP->mediumRockSpriteArray[rockSpriteInfoP->mediumRockInd];
- rockSpriteInfoP->mediumRockInd++;
- twoRockSprite = rockSpriteInfoP->mediumRockSpriteArray[rockSpriteInfoP->mediumRockInd];
- rockSpriteInfoP->mediumRockInd++;
-
- SWAddSprite(rockSpriteInfoP->rockSpriteLayerP, oneRockSprite);
- SWSetSpriteLocation(oneRockSprite, rockSpriteP->destFrameRect.left, rockSpriteP->destFrameRect.top);
-
- SWAddSprite(rockSpriteInfoP->rockSpriteLayerP, twoRockSprite);
- SWSetSpriteLocation(twoRockSprite, rockSpriteP->destFrameRect.right, rockSpriteP->destFrameRect.bottom);
-
- // remove the shot
- SWSetSpriteVisible(shotSpriteP, false);
- }
- }
-
-
- void MediumRockCollideProc(
- SpritePtr rockSpriteP,
- SpritePtr shotSpriteP,
- Rect* sectRect)
- {
- if (rockSpriteP->isVisible && shotSpriteP->isVisible)
- {
- RockSpriteInfoPtr rockSpriteInfoP = (RockSpriteInfoPtr)rockSpriteP->userData;
- SpritePtr oneRockSprite, twoRockSprite;
-
- SWSetSpriteVisible(rockSpriteP, false);
- SWSetSpriteMoveProc(rockSpriteP, RemoveRockMoveProc);
-
- oneRockSprite = rockSpriteInfoP->smallRockSpriteArray[rockSpriteInfoP->smallRockInd];
- rockSpriteInfoP->smallRockInd++;
- twoRockSprite = rockSpriteInfoP->smallRockSpriteArray[rockSpriteInfoP->smallRockInd];
- rockSpriteInfoP->smallRockInd++;
-
- SWAddSprite(rockSpriteInfoP->rockSpriteLayerP, oneRockSprite);
- SWSetSpriteLocation(oneRockSprite, rockSpriteP->destFrameRect.left, rockSpriteP->destFrameRect.top);
-
- SWAddSprite(rockSpriteInfoP->rockSpriteLayerP, twoRockSprite);
- SWSetSpriteLocation(twoRockSprite, rockSpriteP->destFrameRect.right, rockSpriteP->destFrameRect.bottom);
-
- // remove the shot
- SWSetSpriteVisible(shotSpriteP, false);
- }
- }
-
-
- void SmallRockCollideProc(
- SpritePtr rockSpriteP,
- SpritePtr shotSpriteP,
- Rect* sectRect)
- {
- if (rockSpriteP->isVisible && shotSpriteP->isVisible)
- {
- SWSetSpriteVisible(rockSpriteP, false);
- SWSetSpriteMoveProc(rockSpriteP, RemoveRockMoveProc);
-
- // remove the shot
- SWSetSpriteVisible(shotSpriteP, false);
- }
- }
-
-
- void RemoveRockMoveProc(
- SpritePtr rockSpriteP,
- Point* spritePoint)
- {
- RockSpriteInfoPtr rockSpriteInfoP = (RockSpriteInfoPtr)rockSpriteP->userData;
-
- SWRemoveSprite(rockSpriteInfoP->rockSpriteLayerP, rockSpriteP);
- SWSetSpriteVisible(rockSpriteP, true);
- SWSetSpriteMoveProc(rockSpriteP, NULL);
- }
-
-
-